// API: 综测分管理相关接口
import { apiClient } from '@/utils/require'

/**
 * 综测分类型定义
 */
export interface Score {
  id: number
  student?: number
  student_name?: string
  student_id?: string
  class_name?: string
  time: number              // 学年
  grade?: number            // 综测总分
  zb_grade?: number         // 基本智育分
  db_grade?: number         // 基本德育分
  tb_grade?: number         // 基本体育分
  za_grade?: number         // 附加智育分
  da_grade?: number         // 附加德育分
  ta_grade?: number         // 附加体育分
  fail?: number             // 挂科数
  created_at: string
  updated_at: string
}

export interface ScoreRanking extends Score {
  rank: number              // 排名
}

/**
 * 综测分计算公式详情类型
 */
export interface ScoreFormula {
  student_info: {
    student_id: string
    student_name: string
    class_name: string
    major: string
  }
  time: number
  basic_scores: {
    zb_grade: {
      name: string
      value: number
      weight: string
      weighted_value: number
      formula: string
      courses: Array<{ course_name: string; grade: string }>
      course_count: number
    }
    db_grade: {
      name: string
      value: number
      weight: string
      weighted_value: number
      formula: string
    }
    tb_grade: {
      name: string
      value: number
      weight: string
      weighted_value: number
      formula: string
      courses?: Array<{ course_name: string; grade: string }>
      course_count?: number
    }
  }
  additional_scores: {
    za_grade: { name: string; value: number }
    da_grade: { name: string; value: number }
    ta_grade: { name: string; value: number }
  }
  deductions: Array<{
    type: string
    sort: string
    name: string
    ranks: string
    score: number
  }>
  total_deduction: number
  summary: {
    basic_total: number
    additional_total: number
    deduction_total: number
    final_score: number
  }
  final_formula: string
  final_score: number
  stored_score: number
}

export interface PaginatedResponse<T> {
  count: number
  next: string | null
  previous: string | null
  results: T[]
}

/**
 * 综测分管理API
 * 
 * API说明：
 * - 基础路径：/api/scores/
 * - 认证方式：Token认证
 * - 综测分组成：
 *   - 基本分：智育分(zb_grade) + 德育分(db_grade) + 体育分(tb_grade)
 *   - 附加分：智育附加(za_grade) + 德育附加(da_grade) + 体育附加(ta_grade)
 *   - 综测总分 = 基本分 + 附加分 - 挂科扣分
 * - 权限控制：
 *   - 查看：学生看自己，教师看所有
 *   - 计算/修改：仅教师及以上
 */
export const scoreAPI = {
  /**
   * 获取综测分列表
   * 
   * 接口：GET /api/scores/
   * 权限：已认证用户
   * 
   * @param params 查询参数
   * @param params.page 页码
   * @param params.page_size 每页数量
   * @param params.student 按学生筛选（支持学号、姓名或ID）
   * @param params.time 按学年筛选
   * @param params.class_name 按班级筛选
   * 
   * @returns 综测分列表（包含各项分数明细）
   */
  getScoreList: (params?: {
    page?: number
    page_size?: number
    student?: string | number
    time?: number
    class_name?: string
  }) => {
    return apiClient.get<PaginatedResponse<Score>>('/scores/', { params })
  },

  /**
   * 获取综测分详情
   * 
   * 接口：GET /api/scores/{id}/
   * 权限：已认证用户
   * 
   * @param id 综测分ID
   * @returns 综测分详细信息（包含学生信息、各项分数）
   */
  getScoreDetail: (id: number) => {
    return apiClient.get<Score>(`/scores/${id}/`)
  },

  /**
   * 创建综测分
   * 
   * 接口：POST /api/scores/
   * 权限：仅教师及以上
   * 
   * @param data 综测分数据
   * @param data.student 学生ID（必填）
   * @param data.time 学年（必填）
   * @param data.zb_grade 基本智育分
   * @param data.db_grade 基本德育分
   * @param data.tb_grade 基本体育分
   * @param data.za_grade 附加智育分
   * @param data.da_grade 附加德育分
   * @param data.ta_grade 附加体育分
   * @param data.fail 挂科数
   * 
   * @returns 创建成功的综测分记录
   */
  createScore: (data: Partial<Score>) => {
    return apiClient.post('/scores/', data)
  },

  /**
   * 更新综测分
   * 
   * 接口：PUT /api/scores/{id}/
   * 权限：仅教师及以上
   * 
   * @param id 综测分ID
   * @param data 更新的数据
   * @returns 更新后的综测分信息
   */
  updateScore: (id: number, data: Partial<Score>) => {
    return apiClient.put(`/scores/${id}/`, data)
  },

  /**
   * 删除综测分
   * 
   * 接口：DELETE /api/scores/{id}/
   * 权限：仅教师及以上
   * 
   * @param id 综测分ID
   * @returns 204 No Content
   */
  deleteScore: (id: number) => {
    return apiClient.delete(`/scores/${id}/`)
  },

  /**
   * 计算综测分
   * 
   * 接口：POST /api/scores/calculate/
   * 权限：仅教师及以上
   * 
   * 功能：根据学生的成绩自动计算综测分
   * 
   * @param data 计算参数
   * @param data.student 学生ID（可选，不传则计算所有学生）
   * @param data.time 学年（必填）
   * @param data.grade_level 年级（必填：大一/大二/大三/大四）
   * 
   * @returns 计算结果统计
   * 
   * @example
   * // 计算所有学生
   * scoreAPI.calculateScore({ time: 2024, grade_level: '大一' })
   * // 计算指定学生
   * scoreAPI.calculateScore({ student: 1, time: 2024, grade_level: '大一' })
   */
  calculateScore: (data: { student?: number; time: number; grade_level: string }) => {
    return apiClient.post('/scores/calculate/', data)
  },

  /**
   * 综测分排名
   * 
   * 接口：GET /api/scores/ranking/
   * 权限：已认证用户
   * 
   * @param params 排名参数
   * @param params.time 学年（必填）
   * @param params.scope 排名范围（class=班级、major=专业、college=学院）
   * @param params.scope_value 范围值（如班级名称、专业名称等）
   * 
   * @returns 排名列表（包含排名、学生信息、综测分）
   * 
   * @example
   * // 查询计算机2021-1班的排名
   * scoreAPI.getScoreRanking({ 
   *   time: 2024, 
   *   scope: 'class', 
   *   scope_value: '计算机2021-1班' 
   * })
   */
  getScoreRanking: (params: {
    time: number
    scope?: 'class' | 'major' | 'college'
    scope_value?: string
  }) => {
    return apiClient.get<{ count: number; results: ScoreRanking[] }>('/scores/ranking/', { params })
  },

  /**
   * 获取综测分计算公式详情
   * 
   * 接口：GET /api/scores/{id}/formula/
   * 权限：已认证用户
   * 
   * 功能：获取该综测分的详细计算过程，包括：
   * - 基本智育分计算（该学年所有课程平均分）
   * - 基本德育分计算（固定分值或计算规则）
   * - 基本体育分计算（体育课成绩）
   * - 附加智育分、德育分、体育分
   * - 处分扣分明细
   * - 最终综测分计算公式
   * 
   * @param id 综测分ID（必填）
   * 
   * @returns 计算公式详情（包含各项分数计算过程和公式）
   * 
   * @example
   * scoreAPI.getScoreFormula(123)
   * // 返回示例：
   * // {
   * //   student_info: { student_id: "2023001", student_name: "张三" },
   * //   basic_scores: {
   * //     zb_grade: { value: 85.5, formula: "(85+86+84+87)/4", courses: [...] },
   * //     ...
   * //   },
   * //   final_formula: "综测分 = (85.5×0.7 + 80×0.2 + 90×0.1) + 5 - 2 = 95.85",
   * //   final_score: 95.85
   * // }
   */
  getScoreFormula: (id: number) => {
    return apiClient.get<{
      code: number
      message: string
      data: ScoreFormula
    }>(`/scores/${id}/formula/`)
  }
}

export default scoreAPI
